﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GraphLibrary.Algorithms
{
    sealed public class ConnectedComponents<TVertex, TEdge> : GraphAlgorithm<TVertex, TEdge>
        where TEdge : IEdge<TVertex>
    {
        //словарь, в котором ключом является вершина, а значением номер компоненты, к которой эта вершина принадлежит
        Dictionary<TVertex, int> _connectedComponents = new Dictionary<TVertex, int>();
        //количество компонент
        int _components = 0;

        public ConnectedComponents(IGraph<TVertex, TEdge> graph)
        {
            Graph = graph;
        }

        public Dictionary<TVertex, int> Components
        {
            get
            {
                return _connectedComponents;
            }
        }
        

        public void Execute()
        {
            DepthFirstSearch<TVertex, TEdge> dfs = new DepthFirstSearch<TVertex, TEdge>(Graph);

            dfs.LeaveVertex += delegate (TVertex v)
            {
                _connectedComponents[v] = _components;
            };

            dfs.ChangeConnectedComponent += delegate()
            {
                _components++;
            };

            dfs.Execute();                
        }

    }
}
